Skip to content

Design system, rebrand styles, and lucide→Phosphor icon migration#1027

Open
Abeuty wants to merge 12 commits into
mainfrom
ds-rebrand-phosphor-icons
Open

Design system, rebrand styles, and lucide→Phosphor icon migration#1027
Abeuty wants to merge 12 commits into
mainfrom
ds-rebrand-phosphor-icons

Conversation

@Abeuty

@Abeuty Abeuty commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

What

Builds out the /ds design system as the source of truth for the site, applies its rebrand tokens/type across the app, and migrates every icon from lucide-react to @phosphor-icons/react.

Design system (/ds)

  • Rendered style book with tree nav — Styles (Colors, Typography, Iconography, Icon Migration, Shadows, Effects), Figma Tokens (Palette, Semantic Tokens), Components (Buttons, Badges, Inputs, Dropdown, Avatar, Spinner, Collapsible, Breadcrumbs, Cards).
  • Figma token layer in app.css via @theme static — primitives (--color-ds-*), library (--color-lib-*), and semantic tokens (text/background/border/icon/action/status/accent) with html.dark overrides. Editing a primitive propagates through everything that references it.
  • New-system component kit at src/components/ds/ui built on the semantic tokens.

Site-wide rebrand

  • Global type: h1..h6 → Bricolage Grotesque, mono → IBM Plex Mono, loaded globally from __root.tsx. Re-pointing --font-ds-* restyles the whole site.
  • Navbar: swapped to the new rebrand landscape logo (light/dark variants), centered nav, centered mega menu.
  • PalmSpinner: a branded pixel-art palm loader that sways at the trunk base (respects prefers-reduced-motion).

Icon migration — lucide → Phosphor (155 files)

  • 218 distinct icons (85 keep their name, 133 renamed) at regular weight. Every Phosphor target was validated against the installed package before the sweep.
  • Props translated: dropped strokeWidth/absoluteStrokeWidth, fillweight="fill", LucideIcon type → Phosphor Icon type; aliases (Search as SearchIconMagnifyingGlass as SearchIcon) and same-target collisions (Layers/Boxes/SquareStackStack) handled.
  • /ds/icon-migration review page renders old → new glyphs side by side (Flagged / Renamed / All tabs + search) so maintainers can flag any swap that doesn't fit its context.

Notes for reviewers

  • lucide-react is intentionally kept installed — the review page renders the "before" glyphs from it. It can be removed once that page is retired.
  • A few icon mappings are judgment calls worth a look on /ds/icon-migration (e.g. Server→HardDrives, Route→Path, Milestone→MapPinLine, Activity→Pulse, Dock→AppWindow, and the four that collapse to Stack).
  • The unreferenced 193MB public/videos/hero.mp4 is deliberately not included in this PR.
  • Verified: tsc clean, lint clean, unit tests pass (all via pre-commit), and /ds pages render without console errors.

🤖 Generated with Claude Code

…ration

Build out the /ds design system as the source of truth for the site and
apply its tokens, type, and icons across the app.

Design system (/ds):
- Rendered style book with tree nav: Styles (Colors, Typography, Iconography,
  Icon Migration, Shadows, Effects), Figma Tokens (Palette, Semantic Tokens),
  and Components (Buttons, Badges, Inputs, Dropdown, Avatar, Spinner,
  Collapsible, Breadcrumbs, Cards).
- Figma token layer in app.css (@theme static): primitives (--color-ds-*),
  library (--color-lib-*), and semantic tokens (text/background/border/icon/
  action/status/accent) with html.dark overrides.
- New-system component kit (src/components/ds/ui) on the semantic tokens.

Site-wide rebrand application:
- Global type: h1..h6 → Bricolage Grotesque, mono → IBM Plex Mono, fonts
  loaded globally from __root.tsx. Editing --font-ds-* propagates everywhere.
- Navbar swapped to the new rebrand landscape logo (light/dark variants) with
  centered nav; mega menu centered.
- Palm-tree pixel-art spinner (PalmSpinner) that sways at the trunk base.

Icon migration (lucide-react → @phosphor-icons/react), 155 files:
- 218 distinct icons (85 kept name, 133 renamed) at regular weight.
- Props translated: dropped strokeWidth/absoluteStrokeWidth, fill→weight="fill",
  LucideIcon type → Phosphor Icon type; aliases and same-target collisions handled.
- /ds/icon-migration review page renders old→new glyphs side by side so
  maintainers can flag any swap that doesn't fit its context.

lucide-react is kept installed (the review page renders the "before" glyphs);
it can be removed once that page is retired.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 200 files, which is 50 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e139c3e1-9623-4962-b2c9-715060f02977

📥 Commits

Reviewing files that changed from the base of the PR and between 4b2c635 and bb0fe1e.

⛔ Files ignored due to path filters (21)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/blog-assets/tanstack-has-a-new-look/design-system-snapshot.svg is excluded by !**/*.svg
  • public/blog-assets/tanstack-has-a-new-look/logo-swatch.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-emblem-black.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-emblem-charcoal.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-emblem-cream.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-emblem-white.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-landscape-black.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-landscape-charcoal.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-landscape-white.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-stacked-black.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-stacked-charcoal.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-stacked-cream.svg is excluded by !**/*.svg
  • public/images/brand/tanstack-stacked-white.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/landscape-black.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/landscape-charcoal.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/landscape-white.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/stacked-black.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/stacked-charcoal.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/stacked-cream.svg is excluded by !**/*.svg
  • public/images/brand/tanstack/stacked-white.svg is excluded by !**/*.svg
📒 Files selected for processing (200)
  • .agents/index.md
  • .claude/launch.json
  • package.json
  • src/blog/tanstack-has-a-new-look.md
  • src/builder/templates.ts
  • src/components/ApplicationStarter.tsx
  • src/components/AuthenticatedUserMenu.tsx
  • src/components/Avatar.tsx
  • src/components/AvatarCropModal.tsx
  • src/components/BlogAuthorFilter.tsx
  • src/components/BrandContextMenu.tsx
  • src/components/Breadcrumbs.tsx
  • src/components/CodeExplorerTopBar.tsx
  • src/components/CopyPageDropdown.tsx
  • src/components/Doc.tsx
  • src/components/DocFeedbackFloatingButton.tsx
  • src/components/DocFeedbackNote.tsx
  • src/components/DocFeedbackProvider.tsx
  • src/components/ExampleDeployDialog.tsx
  • src/components/FeatureGrid.tsx
  • src/components/FeedbackLeaderboard.tsx
  • src/components/FeedbackModerationList.tsx
  • src/components/FilterComponents.tsx
  • src/components/FrameworkCard.tsx
  • src/components/ImageUpload.client.tsx
  • src/components/LibraryLayout.tsx
  • src/components/LibraryStatsSection.tsx
  • src/components/LibraryTestimonials.tsx
  • src/components/LoginModal.tsx
  • src/components/MegaMenuItem.tsx
  • src/components/Navbar.tsx
  • src/components/NavbarAuthControls.tsx
  • src/components/NavbarCartButton.tsx
  • src/components/NewsletterSignup.tsx
  • src/components/NotFound.tsx
  • src/components/NotesModerationList.tsx
  • src/components/OpenSourceStats.tsx
  • src/components/PaginationControls.tsx
  • src/components/PartnershipCallout.tsx
  • src/components/SearchButton.tsx
  • src/components/SearchModal.tsx
  • src/components/Select.tsx
  • src/components/ShowcaseCard.tsx
  • src/components/ShowcaseDetail.tsx
  • src/components/ShowcaseGallery.tsx
  • src/components/ShowcaseModerationList.tsx
  • src/components/ShowcaseSection.tsx
  • src/components/ShowcaseSubmitForm.tsx
  • src/components/Spinner.tsx
  • src/components/SponsorSection.tsx
  • src/components/TableComponents.tsx
  • src/components/ThemeToggle.tsx
  • src/components/TocMobile.tsx
  • src/components/UserFeedbackSection.tsx
  • src/components/VersionSelect.tsx
  • src/components/account/AccountProfilePictureSection.client.tsx
  • src/components/admin/AdminAccessDenied.tsx
  • src/components/admin/DocsCacheTab.tsx
  • src/components/admin/UserAvatar.tsx
  • src/components/application-builder/parts.tsx
  • src/components/builder/BuilderSummary.tsx
  • src/components/builder/BuilderWorkspace.tsx
  • src/components/builder/CustomAddonDialog.tsx
  • src/components/builder/CustomTemplateDialog.tsx
  • src/components/builder/DeployDialog.tsx
  • src/components/builder/FeaturePicker.tsx
  • src/components/charts/ChartControls.tsx
  • src/components/ds/DsKit.tsx
  • src/components/ds/ds-nav.ts
  • src/components/ds/ui/PalmSpinner.tsx
  • src/components/ds/ui/index.tsx
  • src/components/game/engine/entities/Coins.ts
  • src/components/game/ui/CompleteOverlay.tsx
  • src/components/game/ui/GameHUD.tsx
  • src/components/game/ui/StatsHUD.tsx
  • src/components/home/HomeSocialProofSection.tsx
  • src/components/icons/CheckCircleIcon.tsx
  • src/components/icons/CogsIcon.tsx
  • src/components/landing/AiLanding.tsx
  • src/components/landing/CliLanding.tsx
  • src/components/landing/ConfigLanding.tsx
  • src/components/landing/DbLanding.tsx
  • src/components/landing/DevtoolsLanding.tsx
  • src/components/landing/FormLanding.tsx
  • src/components/landing/HotkeysLanding.tsx
  • src/components/landing/IntentLanding.tsx
  • src/components/landing/LandingCopyPromptButton.tsx
  • src/components/landing/PacerLanding.tsx
  • src/components/landing/QueryLanding.tsx
  • src/components/landing/RangerLanding.tsx
  • src/components/landing/RouterLanding.tsx
  • src/components/landing/StartLanding.tsx
  • src/components/landing/StoreLanding.tsx
  • src/components/landing/TableLanding.tsx
  • src/components/landing/VirtualLanding.tsx
  • src/components/landing/WorkflowLanding.tsx
  • src/components/markdown/CodeBlockView.tsx
  • src/components/markdown/MarkdownContent.tsx
  • src/components/npm-stats/BaselineSection.tsx
  • src/components/npm-stats/ChartControls.tsx
  • src/components/npm-stats/DisabledChartActions.tsx
  • src/components/npm-stats/LatestBucketNavigator.tsx
  • src/components/npm-stats/NPMStatsChart.tsx
  • src/components/npm-stats/PackagePills.tsx
  • src/components/npm-stats/PackageSearch.tsx
  • src/components/npm-stats/StatsTable.tsx
  • src/components/shop/CartDrawer.tsx
  • src/components/shop/ui/Qty.tsx
  • src/components/stack/CategoryArticle.tsx
  • src/libraries/ai.tsx
  • src/libraries/cli.tsx
  • src/libraries/config.tsx
  • src/libraries/db.tsx
  • src/libraries/devtools.tsx
  • src/libraries/form.tsx
  • src/libraries/hotkeys.tsx
  • src/libraries/intent.tsx
  • src/libraries/pacer.tsx
  • src/libraries/query.tsx
  • src/libraries/ranger.tsx
  • src/libraries/router.tsx
  • src/libraries/start.tsx
  • src/libraries/store.tsx
  • src/libraries/table.tsx
  • src/libraries/virtual.tsx
  • src/libraries/workflow.tsx
  • src/routeTree.gen.ts
  • src/routes/__root.tsx
  • src/routes/_library/$libraryId/$version.docs.blog.tsx
  • src/routes/_library/$libraryId/$version.docs.contributors.tsx
  • src/routes/_library/$libraryId/$version.docs.framework.$framework.examples.$.tsx
  • src/routes/_library/$libraryId/$version.docs.npm-stats.tsx
  • src/routes/account/feedback.tsx
  • src/routes/account/index.tsx
  • src/routes/account/integrations.tsx
  • src/routes/account/notes.tsx
  • src/routes/account/submissions.tsx
  • src/routes/admin/audit.tsx
  • src/routes/admin/feedback_.$id.tsx
  • src/routes/admin/github-stats.tsx
  • src/routes/admin/index.tsx
  • src/routes/admin/intent.tsx
  • src/routes/admin/logins.tsx
  • src/routes/admin/npm-stats.tsx
  • src/routes/admin/roles.$roleId.tsx
  • src/routes/admin/roles.index.tsx
  • src/routes/admin/route.tsx
  • src/routes/admin/showcases_.$id.tsx
  • src/routes/admin/users.$userId.tsx
  • src/routes/admin/users.tsx
  • src/routes/ads.tsx
  • src/routes/blog.index.tsx
  • src/routes/brand-guide.tsx
  • src/routes/dashboard.tsx
  • src/routes/ds.avatar.tsx
  • src/routes/ds.badges.tsx
  • src/routes/ds.breadcrumbs.tsx
  • src/routes/ds.buttons.tsx
  • src/routes/ds.cards.tsx
  • src/routes/ds.collapsible.tsx
  • src/routes/ds.colors.tsx
  • src/routes/ds.dropdown.tsx
  • src/routes/ds.effects.tsx
  • src/routes/ds.icon-migration.tsx
  • src/routes/ds.iconography.tsx
  • src/routes/ds.index.tsx
  • src/routes/ds.inputs.tsx
  • src/routes/ds.navbar.tsx
  • src/routes/ds.palette.tsx
  • src/routes/ds.semantic.tsx
  • src/routes/ds.shadows.tsx
  • src/routes/ds.spinner.tsx
  • src/routes/ds.tsx
  • src/routes/ds.typography.tsx
  • src/routes/ethos.tsx
  • src/routes/index.tsx
  • src/routes/intent/registry/$packageName.tsx
  • src/routes/learn.tsx
  • src/routes/login.tsx
  • src/routes/maintainers.tsx
  • src/routes/merch.tsx
  • src/routes/oauth/authorize.tsx
  • src/routes/paid-support.tsx
  • src/routes/partners.$partner.tsx
  • src/routes/partners.index.tsx
  • src/routes/partners.railway.tsx
  • src/routes/shop.cart.tsx
  • src/routes/shop.search.tsx
  • src/routes/stats/npm/index.tsx
  • src/routes/tenets.tsx
  • src/routes/workshops.tsx
  • src/server/blog.ts
  • src/styles/app.css
  • src/ui/Badge.tsx
  • src/ui/Button.tsx
  • src/ui/FormInput.tsx
  • src/ui/Tooltip.tsx
  • src/utils/blog.functions.ts
  • src/utils/blog.ts
  • src/utils/publicImageDimensions.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ds-rebrand-phosphor-icons

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 2, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
tanstack-com bb0fe1e Commit Preview URL

Branch Preview URL
Jul 10 2026, 09:31 PM

tannerlinsley and others added 11 commits July 3, 2026 15:23
…cons

# Conflicts:
#	src/components/ApplicationStarter.tsx
#	src/components/OpenSourceStats.tsx
#	src/components/npm-stats/BaselineSection.tsx
#	src/components/npm-stats/ChartControls.tsx
#	src/components/npm-stats/PackagePills.tsx
#	src/components/npm-stats/PackageSearch.tsx
#	src/routes/_library/$libraryId/$version.docs.npm-stats.tsx
#	src/routes/admin/intent.tsx
#	src/routes/admin/npm-stats.tsx
#	src/routes/stats/npm/index.tsx
Design-system follow-ups on top of the rebrand:

- Palette: bridge legacy gray/twine to the warm DS neutral ramp in app.css so
  the whole site adopts the new palette; migrate the shared primitives (Button,
  Badge, FormInput, Tooltip) to semantic tokens.
- Typography: add semantic .h1-.h6 classes; move Font families to the top of
  /ds/typography and make the family cards minimal.
- MegaMenuItem: extract the mega-menu row into a reusable component matched to
  the Figma "Mega Menu Item" (bordered 44px icon, Bricolage-bold title, #aba594
  description, adaptive hover/press); wire it into the Navbar with 8px spacing
  between items.
- /ds/navbar: new Navbar DS page - anatomy preview with a device-size toggle
  (Auto/Mobile/iPad/Desktop) driven by container queries, plus a MegaMenuItem
  showcase. Add a "Design System" nav item under Support.
- Home: remove the "Browse the stack" section; restructure "Why TanStack" into
  four centered principle sections. Refine navbar spacing.
- Icons: finish the lucide->Phosphor migration (CheckCircleIcon->CheckCircle,
  CogsIcon->Gear); remove the orphaned custom icons.
- Spinner: remove the Palm spinner demo from /ds/spinner.
- Add @figma/code-connect dev dependency.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bump the shared DsPage wrapper from max-w-5xl (1024px) to max-w-7xl (1280px)
so all design-system pages use more horizontal space on wide screens (e.g. the
icon-migration grid no longer truncates names). Header stays left-aligned.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Resolve conflicts with the updated base:
- pnpm-lock.yaml: regenerated from the merged package.json (keeps @figma/
  code-connect plus the base's new deps).
- app.css: the base added a :root/:host block pinning grays to the original
  cool values (a layer-stability fix); updated it to the warm DS-neutral bridge
  values so the palette shift isn't reverted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Centered header (PRINCIPLES eyebrow + display title + subtitle) over a
  single bordered container with 4 full-width stacked principle cards
- Adopt DS rebrand tokens: Bricolage Grotesque display, IBM Plex Mono,
  ds color/type semantic tokens (theme-aware, works light + dark)
- Per-card eyebrow accents (terracotta/green/blue/purple) matching Figma
- Keep the proof visualizations; float them (no surface box) and scale
  them up to fill the media slot's footprint
- Drop the now-unused per-card icons and iconClassName field

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ds-rebrand-followups

# Conflicts:
#	src/routes/index.tsx
…cons

# Conflicts:
#	src/routes/index.tsx
#	src/routes/partners.railway.tsx
…ds-rebrand-followups

# Conflicts:
#	src/routes/index.tsx
#	src/routes/workshops.tsx
…only SVGs

Continue the rebrand rollout by replacing the leftover old TanStack logos
with the new brand assets, and remove the unreferenced 193MB hero video.

- Extract emblem-only SVGs from the stacked logo's island path into
  public/images/brand/tanstack-emblem-{black,white,charcoal,cream}.svg
  (the rebrand set only shipped stacked/landscape, both with the wordmark).
- SearchModal AI-message avatar → emblem (theme-swapped black/white).
- Game coin texture → emblem-black.
- BrandContextMenu download menu → Landscape / Stacked / Emblem (black + white).
- brand-guide asset sections → Landscape / Stacked / Emblem in brand colors.
- login + oauth/authorize splash → emblem (theme-swapped).
- Remove unreferenced public/videos/hero.mp4 (193MB, never committed).
- launch.json: autoPort so the dev server falls back off a busy port 3000.

Left intentionally (separate follow-ups): homepage hero (redesign scope),
ShopHero3D 3D textures, and favicons/OG images (need PNG rasterization + a
mono-vs-color decision).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants